#include <iostream>

using namespace std;

int main(int argc, const char** argv) {
    int a =200;  //变量名 实质为一段内存空间的别名。

//    *(int *)0xb0002345 = 500
    int & k = a;  //*声明*

//引用是一种声明关系,声明的时候必须要初始化，一经声明不可变更。
//**引用不开辟空间。**

//与远类型保持一致。
//可以对引用再次引用，多次引用的结果指向同一个变量。
//&符号前有数据类型时是引用，，其他皆为取地址。

    printf("%p\n", &a);
    printf("%p", &k);
//地址相同

//平级内解决问题，不开辟多余的空间

//引用的本质，是对指针的再次包装。指针可以有引用（int * p; int * & = p //ok），不应该有引用的指针（int a;int &ra=a;int& *p =&ra //错误）。

    return 0;
}

//1·可以定义指针的引用，但不能*`定义`引用的引用*。（int & &ra = a; //错误）
//2·可以定义指针的指针（二级指针），但不能定义引用的指针。
//3·可以定义指针数组，但不能定义引用数组，可以定义数组引用。
// int a,b,c;
// int* parr[] = {&a, &b, &c};  //正确
// int& rarr[] = {a,b,c};      //错误
// int arr[] = {1, 2, 3};
// int (&arry)[3] = arr;     //ok


//一级指针：即我们一般说的指针，就是内存地址；
// 二级指针：指向指针的指针，就是地址的地址；

// 如：

// int a=1;

// int *p=&a;　　// p为a变量的地址，通过*p可以得到a的值

// int **q=&p; 　　// q为p指针的地址，通过**q可以得到a的值 

// by lrunn